/**********************************************************************************\
** 文件名称: PackTask.c
** 创建人员: YCG
** 创建日期: 2019-05-05
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "PackTask.h"

PackRece_t yLLRece[1];
extern CRC_HandleTypeDef hcrc;

Pack_t* LL_PackedData( uint8_t yPackCtrl, uint16_t yDataNum, uint16_t yPackNum, uint16_t yPackCount, uint8_t * ySrc);

/*******************************************************************************
** 函数名称: StartAPPTask
** 功能描述:
** 参数说明: argument: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-03-10
********************************************************************************/
void PackTask(void * argument)
{
    for(;;)
    {
//        Pack_t* yPack;
   //     yPack = LL_PackedData(0x81, sizeof("水下无线光通信数据帧测试!"), 1, 1, (uint8_t*)"水下无线光通信数据帧测试!");
        // UprintfBuf((uint8_t*)yPack, PackSize(yPack));


        //  Uprintf("\n起始信号:0x%2x\n", yPack->StartCheck);
//			 osDelay(1);
//
//			 Uprintf("控制位段:0x%2x\n",yPack->PackCtrl.u8[0]);
//			 osDelay(1);
//			 Uprintf("数据数量:0x%2x\n",yPack->DataNum.u16);
//			 osDelay(1);
//			 Uprintf("帧总数量:0x%2x\n",yPack->PackNum.u16);
//			 osDelay(1);
//			 Uprintf("帧计数  :0x%2x\n",yPack->PackCount.u16);
//			 osDelay(1);
//
//			 Uprintf("帧头CRC:0x%4x\n",yPack->PackCRC.u32);
//			 osDelay(1);
//
//			 Uprintf("数据UTF-8编码:%s\n","水下无线光通信数据帧测试!");
//			 osDelay(1);
//
//			 Uprintf("数据CRC:0x%4x\n",*(uint32_t *)(&(yPack->Data)+Allgnment4(yPack->DataNum.u16)));
//			 osDelay(1);


    //    MyFree(yPack);

			Uprintf("%s\r\n",pcTaskGetName(NULL));
			vTaskDelay(1000);
    }
}



/*******************************************************************************
** 函数名称: LL_PackData
** 功能描述: 将需要发送的数据进行打包
** 参数说明: yPackCtrl: [输入] 包类型
**			     yPackNum:  [输入] 包序号
**			     yDataNum:  [输入] 此包的数据数量
**			     ySrc: [输入]     源数据地址
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-03-22
********************************************************************************/
Pack_t* PackedData( uint8_t yPackCtrl, uint16_t yDataNum, uint16_t yPackNum, uint16_t yPackCount, uint8_t * ySrc)
{
    Pack_t* yPack = MyMalloc(sizeof(Pack_t) + yDataNum);   //申请内存地址,内存的申请是8字节对齐的

    yPack->StartCheck.u32 = 0x17117019;    //起始信号

    yPack->PackCtrl.u8[0] =  yPackCtrl;    //包控制位段
    yPack->PackCtrl.u8[1] = ~yPackCtrl;    //包控制校验

    yPack->DataNum.u16   = yDataNum;       //数据数量
    yPack->PackNum.u16   = yPackNum;       //帧总数量
    yPack->PackCount.u16 = yPackCount;     //帧计数

    yPack->PackCRC.u32 = HAL_CRC_Calculate(&hcrc,  (uint32_t*)yPack, 3);    //帧头计算CRC

    memcpy(&yPack->Data, ySrc, yDataNum);  //复制数据到数据帧

    uint8_t   yAllgnment = yDataNum & 0x03;   //判断有没有四字节对齐
    uint16_t  DataNum = 0;

    if(yAllgnment == 0) {   //已对齐
        DataNum = yDataNum;
    } else {                 //未对齐
        DataNum = yDataNum + 4 - yAllgnment; //进行对齐
        memset(&yPack->Data + yDataNum, 0x00, 4 - yAllgnment); //补齐0
    }

    uint32_t* yDataCRC = (uint32_t*)(&yPack->Data + DataNum);     //计算数据CRC地址
    *yDataCRC = HAL_CRC_Calculate(&hcrc, (uint32_t*)&yPack->Data, DataNum >> 2);   //数据计算CRC

    return yPack;
}
/********************************End of File************************************/
